/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.dp1.pucp.Modelo.Algoritmos;

import com.dp1.pucp.Modelo.Clases.Productosimulacion;
import com.dp1.pucp.Modelo.Clases.Simulacion;
import java.util.ArrayList;
import java.util.Date;

/**
 *
 * @author Rodrigo
 */
public class Solucion {
    
    
    private ArrayList<EmpleadoAlgoritmo> asignados = new ArrayList();
    private ArrayList<MaquinaA> maquinas = new ArrayList();
    private double funcionObjetivo;
    private ArrayList<Galleta> galletas = new ArrayList();
    private int turno;
//    private int[] inv_ini;
//    private int[] inv_nuevo;
   // private int estado;
    /**
     * @return the asignados
     */
    public ArrayList<EmpleadoAlgoritmo> getAsignados() {
        return asignados;
    }

    /**
     * @param asignados the asignados to set
     */
    public void setAsignados(ArrayList<EmpleadoAlgoritmo> asignados) {
        this.asignados = asignados;
    }

    /**
     * @return the funcionObjetivo
     */
    public double getFuncionObjetivo() {
        return funcionObjetivo;
    }

    /**
     * @param funcionObjetivo the funcionObjetivo to set
     */
    public void setFuncionObjetivo(double funcionObjetivo) {
        this.funcionObjetivo = funcionObjetivo;
    }

    public void calcularObjetivoTotal(double costo) {
        this.setFuncionObjetivo(0);
        for (int i = 0; i < asignados.size(); i++) {
            calcularObjetivo(asignados.get(i), costo);
        }
    }

    public void calcularObjetivo(EmpleadoAlgoritmo emp, double costo) {
        int i = 0;
        int pos_tipomaq = emp.getTipoMaquinaAsignada() - 1;
        for (i = 0; i < emp.getGalletaAsignada().getTipogalleta().getPorcentajesValor().size(); i++) {
            if (emp.getTipoMaquinaAsignada() == emp.getGalletaAsignada().getTipogalleta().getMaquinasProceso().get(i)) {
                break;
            }
        }
        double porprecio = emp.getGalletaAsignada().getTipogalleta().getPorcentajesValor().get(i);
        double porcosto = emp.getGalletaAsignada().getTipogalleta().getPorcentajesCosto().get(i);
        int produccion = emp.getProduccion()[pos_tipomaq];
        int merma = emp.getMermas()[pos_tipomaq];
        if (produccion == 0 && merma != 0) {
            this.funcionObjetivo = this.funcionObjetivo - 2 * costo;
        } else if (produccion != 0 && merma == 0) {
            this.funcionObjetivo = this.funcionObjetivo + costo;
        } else {
            this.funcionObjetivo = this.funcionObjetivo
                    + (produccion * emp.getGalletaAsignada().getTipogalleta().getPrecio() * porprecio)
                    / (merma * emp.getGalletaAsignada().getTipogalleta().getCosto() * porcosto)
                    - costo;
        }

    }

    /**
     * @return the galletas
     */
    public ArrayList<Galleta> getGalletas() {
        return galletas;
    }

    /**
     * @param galletas the galletas to set
     */
    public void setGalletas(ArrayList<Galleta> galletas) {
        this.galletas = galletas;
    }

    public void mostrarsol(Solucion solfinal) {
//        for(int i=0;i < solfinal.getAsignados().size() ;i++){  
//            System.out.println("Empleado: "+solfinal.getAsignados().get(i).getIdempleado()+"galleta"+solfinal.getAsignados().get(i).getGalletaAsignada().getIdgalleta()+"tipomaquina"+solfinal.getAsignados().get(i).getTipoMaquinaAsignada() ); 
//        }
        System.out.println("Funcion Objetivo" + solfinal.getFuncionObjetivo());
        for (int i = 0; i < solfinal.getGalletas().size(); i++) {
            System.out.println("Galleta:" + solfinal.getGalletas().get(i).getIdgalleta() + "Demanda producida" + solfinal.getGalletas().get(i).getDemandacubierta() + "de" + solfinal.getGalletas().get(i).getNumGalletasPedidas());
        }
        System.out.println("asignaciones" + solfinal.getAsignados().size());
    }

    /**
     * @return the maquinas
     */
    public ArrayList<MaquinaA> getMaquinas() {
        return maquinas;
    }

    /**
     * @param maquinas the maquinas to set
     */
    public void setMaquinas(ArrayList<MaquinaA> maquinas) {
        this.maquinas = maquinas;
    }
    
    public float calcProd(){
       float prod = 0;
       
        for(int i =0;i < this.galletas.size();i++){
            prod = prod + galletas.get(i).getDemandacubierta();
        }
        return prod;
    }
    
    public float calcMerm(){
        float merm =0;
        for(int i=0;i < this.asignados.size();i++){
            merm = merm + asignados.get(i).getMermas()[asignados.get(i).getTipoMaquinaAsignada()-1];
        }
        return merm;
    }
    
    public void ordenarGall(){
          Galleta aux = new Galleta();
    for (int i=0; i< this.galletas.size() -1 ; i++){
        for(int j=i+1; j< galletas.size(); j++){
            Galleta a = galletas.get(i);
            Galleta b = galletas.get(j);
           if( a.getTipogalleta().getIdTipo() > b.getTipogalleta().getIdTipo()){
               aux = b;
               galletas.set(j, a);
               galletas.set(i, aux);
           }
         }
      }
    }
    
    public Simulacion Convertir(Date fecha){
        Simulacion simulacion = new Simulacion();
        simulacion.setFechaHora(fecha);
        simulacion.setEstado(0);
        simulacion.setProduccion(calcProd());
        simulacion.setMerma(calcMerm());
        return simulacion;
    }

    /**
     * @return the turno
     */
    public int getTurno() {
        return turno;
    }

    /**
     * @param turno the turno to set
     */
    public void setTurno(int turno) {
        this.turno = turno;
    }

    /**
     * @return the inv_ini
     */
//    public int[] getInv_ini() {
//        return inv_ini;
//    }
//
//    /**
//     * @param inv_ini the inv_ini to set
//     */
//    public void setInv_ini(int[] inv_ini) {
//        this.inv_ini = inv_ini;
//    }
//
//    /**
//     * @return the inv_nuevo
//     */
//    public int[] getInv_nuevo() {
//        return inv_nuevo;
//    }
//
//    /**
//     * @param inv_nuevo the inv_nuevo to set
//     */
//    public void setInv_nuevo(int[] inv_nuevo) {
//        this.inv_nuevo = inv_nuevo;
//    }
}
